package plantasvszombies;

import jardinzen.JardinZenPage;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.PropertyListView;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.resource.ContextRelativeResource;

import dominio.*;
import exceptions.SaldoInsuficiente;
import applicationModels.*;

@SuppressWarnings("serial")
public class UpgradePlantPage extends WebPage {

	
	private final WebPage mainPage;
	private final Mejorar mejorarApp;
	private final Juego game;
	private Label alert;

	public UpgradePlantPage(WebPage mainPage, Juego g, Planta planta) {
		this.mainPage = mainPage;
		this.game = g;
		
		this.mejorarApp = new Mejorar(game.getUsuario(), planta);
		this.setDefaultModel(new CompoundPropertyModel<Mejorar>(this.mejorarApp));
		
		this.addLinkToIndex();
		this.addLinkToJardinZen();
		
		this.add(new Label("plantaAMejorar.descripcion"));
		this.add(new Label("puntos",new PropertyModel<Integer>(this.game.getUsuario(), "puntos")));
		this.add(new Image("plantImage", new ContextRelativeResource("plantas/"+mejorarApp.getPlantaAMejorar().getNombre()+".png")));

		this.addTablaMejorasDisponibles();
		
		this.addTablaMejorasCompradas();
		
		this.addAlertPanel();
	}
	
	protected void addTablaMejorasDisponibles() {
		Form<Planta> mejorasDispForm = new Form<Planta>("plantaAMejorar", new CompoundPropertyModel<Planta>(mejorarApp.getPlantaAMejorar()));
		this.generarTablaMejorasDisponibles(mejorasDispForm);
		this.add(mejorasDispForm);		
	}

	@SuppressWarnings("rawtypes")
	protected void addLinkToIndex() {
		this.add(new Link("indexlink") {
			@Override
			public void onClick() {
				volver();
			}
		});
	}
	
	@SuppressWarnings("rawtypes")
	protected void addLinkToJardinZen() {
		this.add(new Link("botonJardin") {
			@Override
			public void onClick() {
				volverAlJardin(game);
			}
		});
	}
	
	private void addTablaMejorasCompradas() {
		this.add(new PropertyListView<Mejora>("plantaAMejorar.mejorasCompradas") {

			@Override
			protected void populateItem(final ListItem<Mejora> item) {
				item.add(new Label("nombre"));
				item.add(new Label("ataque"));
				item.add(new Label("defensa"));
			}
		});
	}

	private void generarTablaMejorasDisponibles(Form<Planta> parent) {
		// Resultados mejoras disponibles
		parent.add(new PropertyListView<Mejora>("mejorasDisponibles") {

			@Override
			protected void populateItem(final ListItem<Mejora> item) {
				item.add(new Label("nombre"));
				item.add(new Label("precio"));
				item.add(new Label("ataque"));
				item.add(new Label("defensa"));
				
				item.add(new Button("mejorar") {
					@Override
					public void onSubmit() {
						Mejora mejora = item.getModelObject();
						mejorarApp.buscarYSetearMejora(mejora.getNombre());
						try {
							mejorarApp.mejorar();
							alert("Mejora comprada", true);
						} catch (SaldoInsuficiente e) {
							alert("Saldo insuficiente", false);
						}
					}
				});
			}

		});
	}

	protected void volverAlJardin(Juego g) {
       JardinZenPage jardinPage = new JardinZenPage(mainPage, g);
       this.setResponsePage(jardinPage);
	}

	protected void volver() {
		this.setResponsePage(mainPage);
	}
	
	protected void alert(String texto, boolean buena) {
		String type = buena ? "notify" : "alert";
		this.alert.add(new AttributeModifier("class", type));
		this.alert.add(new AttributeModifier("value", texto));
	}
	
	protected void addAlertPanel() {
		this.alert = new Label("exceptions", new Model<String>(""));
		this.add(this.alert);
	}
}
